package logger

import (
	"fmt"
	"io"
	"log/slog"
	"os"
	"strings"

	"github.com/catroll/fastdns/internal/config"
)

var defaultLogger *slog.Logger

// Setup 根据配置初始化日志系统
func Setup(cfg *config.Config) error {
	var (
		handler slog.Handler
		writer  io.Writer
	)

	// 设置日志输出目标
	switch cfg.Log.Output {
	case "stdout":
		writer = os.Stdout
	case "file":
		file, err := os.OpenFile(cfg.Log.File, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
		if err != nil {
			return fmt.Errorf("无法打开日志文件: %w", err)
		}
		writer = file
	default:
		return fmt.Errorf("不支持的日志输出类型: %s", cfg.Log.Output)
	}

	// 设置日志级别
	var level slog.Level
	switch strings.ToLower(cfg.Log.Level) {
	case "debug":
		level = slog.LevelDebug
	case "info":
		level = slog.LevelInfo
	case "warn":
		level = slog.LevelWarn
	case "error":
		level = slog.LevelError
	default:
		level = slog.LevelInfo
	}

	// 设置日志格式
	opts := &slog.HandlerOptions{
		Level: level,
	}

	switch strings.ToLower(cfg.Log.Format) {
	case "json":
		handler = slog.NewJSONHandler(writer, opts)
	case "text":
		handler = slog.NewTextHandler(writer, opts)
	default:
		handler = slog.NewTextHandler(writer, opts)
	}

	// 创建并设置默认日志记录器
	defaultLogger = slog.New(handler)
	slog.SetDefault(defaultLogger)

	Info("日志系统初始化完成", "level", cfg.Log.Level, "format", cfg.Log.Format, "output", cfg.Log.Output)
	return nil
}

// Debug 记录调试级别的日志
func Debug(msg string, args ...any) {
	slog.Debug(msg, args...)
}

// Info 记录信息级别的日志
func Info(msg string, args ...any) {
	slog.Info(msg, args...)
}

// Warn 记录警告级别的日志
func Warn(msg string, args ...any) {
	slog.Warn(msg, args...)
}

// Error 记录错误级别的日志
func Error(msg string, args ...any) {
	slog.Error(msg, args...)
}

// With 返回带有附加上下文的新日志记录器
func With(args ...any) *slog.Logger {
	return slog.With(args...)
}

// GetLogger 返回默认日志记录器
func GetLogger() *slog.Logger {
	return defaultLogger
}
